package link.wangkui.lamda;

/**
 * Lambda表达式访问外部的变量(局部变量，成员变量，静态变量，接口的默认方法),
 * 它与匿名内部类访问外部变量非常相似。
 */
public class LamdaTest {

    /**
     * 静态变量
     */
    static int outerStaticNum;
    /**
     * 成员变量
     */
    int outerNum;

    public static void main(String[] args) {
        // 访问局部变量
        // 从lambda表达式的外部范围读取最终局部变量num；
        int num = 1;
        IConverter<Integer, String> stringConverter = from -> String.valueOf(from + num);
        String convert = stringConverter.convert(2);
        System.out.println(convert); // 3


        // 但是这个num是不可变值，这样改变值会报错；
//        int num1 = 1;
//        IConverter<Integer, String> stringConverter1 =
//                (from) -> String.valueOf(from + num1);
//        num1= 3;


        // lambda表达式内部修改也是不允许的；
//        int num2 = 1;
//        IConverter<Integer, String> converter = (from) -> {
//            String value = String.valueOf(from + num2);
//            num2= 3;
//            return value;
//        };
    }

    // 在 Lambda 表达式中访问局部变量。与局部变量相比，
    // 在 Lambda 表达式中对成员变量和静态变量拥有读写权限：
    void testScopes() {
        IConverter<Integer, String> stringConverter1 = (from) -> {
            // 对成员变量赋值
            outerNum = 23;
            return String.valueOf(from);
        };

        IConverter<Integer, String> stringConverter2 = (from) -> {
            // 对静态变量赋值
            outerStaticNum = 72;
            return String.valueOf(from);
        };
    }

    // 访问默认接口方法
    // 有默认实现的接口方法，是不能在 lambda 表达式中访问的
    void testScopes1() {
        IFormula formula = new IFormula() {
            @Override
            public double calculate(int a) {
                return a * a;
            }
        };
//        不能通过lambda表达式访问默认方法，这样的代码没法通过编译；
//        IFormula formula1 = (a) -> sqrt(a * a);
    }
}
